package com.learn.english.model.param;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;

import java.util.List;

/**
 * @author TISNIW
 * @version 1.0
 * @date 2025/6/13 23:58
 * @desc 请求参数
 */
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class GenerateParmeters {
    @JsonProperty("model")
    private String model; // 必需，模型名称

    @JsonProperty("prompt")
    private String prompt; // 生成响应的提示

    @JsonProperty("suffix")
    private String suffix; // 模型响应后的文本

    @JsonProperty("images")
    private List<String> images; // 可选，base64编码的图像列表（用于多模态模型）

    @JsonProperty("think")
    private Boolean think; // 对于思考模型，是否应在响应前思考

    @JsonProperty("format")
    private String format; // 返回响应的格式，可以是json或JSON schema

    @JsonProperty("options")
    private Options options; // 额外的模型参数

    @JsonProperty("system")
    private String system; // 系统消息（覆盖Modelfile中定义的内容）

    @JsonProperty("template")
    private String template; // 提示模板（覆盖Modelfile中定义的内容）

    @JsonProperty("stream")
    private Boolean stream; // 如果为false，则响应作为一个单独的对象返回，而不是对象流

    @JsonProperty("raw")
    private Boolean raw; // 如果为true，则不对提示应用任何格式化

    @JsonProperty("keep_alive")
    private String keepAlive; // 控制模型在请求后保持加载到内存中的时间，默认5分钟

    @JsonProperty("context")
    private String context; // 已弃用，来自先前对/generate的请求的上下文参数

    @Override
    public String toString() {
        return "GenerateParameters{" + '\n' +
                "\tmodel: " + model + ",\n" +
                "\tprompt: " + prompt + ",\n" +
                (suffix != null ? "\tsuffix: " + suffix + ",\n" : "") +
                (images != null ? "\timages: " + images + ",\n" : "") +
                (think != null ? "\tthink: " + think + ",\n" : "") +
                (format != null ? "\tformat: " + format + ",\n" : "") +
                (options != null ? "\toptions: " + options.toString().indent(2) + ",\n" : "") +
                (system != null ? "\tsystem: " + system + ",\n" : "") +
                (template != null ? "\ttemplate: " + template + ",\n" : "") +
                (stream != null ? "\tstream: " + stream + ",\n" : "") +
                (raw != null ? "\traw: " + raw + ",\n" : "") +
                (keepAlive != null ? "\tkeep_alive: " + keepAlive + ",\n" : "") +
                (context != null ? "\tcontext: " + context + "\n" : "") +
                "}";
    }
}